#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
# ----------------------------------------------------------------------------
#  Purpose:     用于实现python函数的性能分析

#  Author:      青衫少年春归也

#  Created:     2019.12.19

# ----------------------------------------------------------------------------
'''


import pathlib
import subprocess
from functools import wraps
from line_profiler import LineProfiler



def get_func_line_run_time(func):
    """
    查询接口中每行代码执行的时间， 代码通过装饰器方式运行
    举个栗子：
        @get_func_line_run_time
        def function():
            pass
    :param func: 装饰的函数
    :return:
    """
    @wraps(func)
    def decorator(*args, **kwargs):
        func_return = func(*args, **kwargs)
        lp = LineProfiler()
        lp_wrap = lp(func)
        lp_wrap(*args, **kwargs)
        lp.print_stats()
        return func_return
    return decorator


def get_moudle_profile_result(py_path:str):
    """
    获取python 模块的性能分析结果
    :param py_path: python文件的路径
    :return:
    """
    path = pathlib.Path(py_path)
    if path.exists():
       return subprocess.getoutput(f"python -m cProfile {py_path}")
    else:
        raise FileNotFoundError(f"{py_path} 文件不存在！")



def get_func_memory_summary(func):
    """
    查询函数的内存消耗情况， 代码通过装饰器方式运行
    举个栗子：
        @get_func_memory_summary
        def function():
            pass
    :param func: 装饰的函数
    :return:
    """
    @wraps(func)
    def decorator(*args, **kwargs):
        from pympler import summary, muppy
        func_return = func(*args, **kwargs)
        all_objects = muppy.get_objects()
        summarize = summary.summarize(all_objects)
        summary.print_(summarize)
        return func_return
    return decorator



